package string;
/*
* 1.java会将所有使用字面量(直接量)形式创建的字符串对象缓存在常量池中
* 2.new String()创建时一定会创建新对象
* 3.String 是不变的对象
* 4.若想比较字符串内容,使用equals()
* */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "abc123";
        String s2 = "abc123";//重用s1对象
        String s3 = "abc123";
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);

        String s4 = new String("123abc");
        System.out.println(s4==s1);//false

        s1 = s1+"!";//字符串是不变对象,修改内容会创建新的对象
        System.out.println(s1==s2);//false,地址不同.意味着不再指向同一个对象
        String s = "123";
        String s5 = s+"abc";//这里编译器不做操作,拼接字符串会产生新对象
        System.out.println(s5==s2);//false,没有重用常量池对象
        String s6 = "123"+"abc";//触发预计算特性,直接编译为String s5 = "123abc",会复用该对象
        System.out.println(s6==s2);//true
        /*
        * ==是比较值是否相等,对于引用类型而言,引用中保存的是地址,所以==比较的也是地址,地址相同意味着两个引用指向了同一个对象
        * 对于字符串而言通过equals()来比较
        * */
        System.out.println("_______________");
        String s7 = "123abc";
        String s8 = new String("123abc");
        System.out.println(s7==s8);
        System.out.println(s7.equals(s8));

    }
}
